package com.example.OnlineStorage.service.FileOperate;

import lombok.SneakyThrows;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface FileOperateService {

	/**
	 * 获取用户的所有文件信息
	 *
	 * @param UUID Token
	 * @return
	 */
	String getFileDataJson(String UUID);

    /**
	 * 创建文件夹
	 *
	 * @param fromPath 从那个路径开始创建
	 * @param name     创建的名称
	 * @param UUID     Token
	 * @return 用户所有的文件信息
	 */
	String createDirectory (String fromPath, String name, String UUID);
	
	/**
	 * 上传文件之前进行一次查询服务器是否有了该文件
	 *
	 * @param fromPath       从那个路径开始上传
	 * @param name           要上传的名称
	 * @param intactSHA256   要上传的文件完整的哈希
	 * @param AllChunkSHA256 文件进行分块之后的哈希数组，要求排好序的
	 * @param UUID           Token
	 * @return {isExist: 是否存在， ChunkSHA256：如果不存在下一次就应该上传这一个文件块|| data: 如果存在会返回所有的文件信息}
	 */
	Map<String, Object> isExist (String fromPath, String name, String intactSHA256, List<String> AllChunkSHA256, String UUID);
	
	
	/**
	 * 上传文件分块
	 *
	 * @param fromPath       从那个路径开始上传
	 * @param name           要上传的名称
	 * @param intactSHA256   要上传的文件完整的哈希
	 * @param ChunkSHA256    上传的文件分块哈希
	 * @param AllChunkSHA256 文件进行分块之后的哈希数组，要求排好序的
	 * @param ChunkFile      要上传的文件
	 * @param UUID           Token
	 * @return {isExist: 上传之后是否完整， ChunkSHA256：如果不完整下一次就应该上传这一个文件块|| data: 如果完整会返回所有的文件信息}
	 */
	Map<String, Object> putChunk (String fromPath,
	                              String name,
	                              String intactSHA256,
	                              String ChunkSHA256,
	                              List<String> AllChunkSHA256,
	                              MultipartFile ChunkFile,
	                              String UUID);
	
	/**
	 * 修改文件夹、文件的名称
	 *
	 * @param fromPath 要修改的路径
	 * @param newName  修改之后的名称
	 * @param UUID     Token
	 * @return 返回所有的文件信息
	 */
	String reviseName (String fromPath,
	                   String newName,
	                   String UUID);
	
	/**
	 * 删除节点
	 *
	 * @param fromPath 要删除的路径
	 * @param UUID     Token
	 * @return 返回所有的文件信息
	 */
	String deleteNode (String fromPath, String UUID);
	
	/**
	 * 删除多个节点
	 *
	 * @param fromPaths 要删除的路径数组
	 * @param UUID      Token
	 * @return 返回所有的文件信息
	 */
	Map<String, Object> deleteNodes (String[] fromPaths, String UUID);
	
	/**
	 * 恢复节点
	 *
	 * @param fromPath  要恢复到哪个路径
	 * @param cacheName 要恢复的缓存名称
	 * @param UUID      Token
	 * @return 返回所有的文件信息
	 */
	String recoveryNode (String fromPath, String cacheName, String UUID);
    
    
    /**
     * 移动节点
     * @param fromPath 从那个路径
     * @param toPath 要移动到那个路径(这个只能是文件夹)
     * @param UUID Token
     * @return 返回所有的文件信息
     */
	String moveNode (String fromPath, String toPath, String UUID);
	
	/**
	 * 获取缓存的节点列表
	 *
	 * @param UUID Token
	 * @return 返回所有的缓存列表
	 */
	Set<Object> getCacheList (String UUID);
}
